package com.cadang.android.bbrproject;

import com.cadang.android.bbrproject.util.*;
import com.cadang.android.bbrproject.util.MediaPlayerService.MediaPlayerBinder;
import com.cadang.android.bbrproject.util.StatefulMediaPlayer.MPStates;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Notification;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;

/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 * 
 * @see SystemUiHider
 */
public class BbrActivity extends Activity 
						 implements OnMediaPlayerServiceListener{
	/**
	 * Whether or not the system UI should be auto-hidden after
	 * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
	 */
	private static final boolean AUTO_HIDE = true;

	/**
	 * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
	 * user interaction before hiding the system UI.
	 */
	private static final int AUTO_HIDE_DELAY_MILLIS = 5000;

	/**
	 * If set, will toggle the system UI visibility upon interaction. Otherwise,
	 * will show the system UI visibility upon interaction.
	 */
	private static final boolean TOGGLE_ON_CLICK = true;

	/**
	 * The flags to pass to {@link SystemUiHider#getInstance}.
	 */
	private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION;

	/**
	 * The instance of the {@link SystemUiHider} for this activity.
	 */
	private SystemUiHider mSystemUiHider;
	
	/**
	 * Stateful Media and Service*
	 */
	private static StatefulMediaPlayer 	mMediaPlayer;
	private static MediaPlayerService	mService;
	private static boolean				mBound;
	private static MediaStream[]		mPlayStreams = ExampleStream.MEDIASTREAMS;
	private static MediaStream			mSelectedStream = ExampleStream.DEFAULT_STREAM_MEDIA;
	private int							mStreamPosition;
	private static boolean				mAutoPlay = true;
	private static boolean				mRepeated = false;
	private static boolean				mIntroShow	= false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_bbr);
				
		final View controlsView = findViewById(R.id.fullscreen_content_controls);
		final View contentView = findViewById(R.id.fullscreen_content);

		// Set up an instance of SystemUiHider to control the system UI for
		// this activity.
		mSystemUiHider = SystemUiHider.getInstance(this, contentView,
				HIDER_FLAGS);
		mSystemUiHider.setup();
		mSystemUiHider
				.setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
					// Cached values.
					int mControlsHeight;
					int mShortAnimTime;

					@Override
					@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
					public void onVisibilityChange(boolean visible) {
						if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
							// If the ViewPropertyAnimator API is available
							// (Honeycomb MR2 and later), use it to animate the
							// in-layout UI controls at the bottom of the
							// screen.
							if (mControlsHeight == 0) {
								mControlsHeight = controlsView.getHeight();
							}
							if (mShortAnimTime == 0) {
								mShortAnimTime = getResources().getInteger(
										android.R.integer.config_shortAnimTime);
							}
							controlsView
									.animate()
									.translationY(visible ? 0 : mControlsHeight)
									.setDuration(mShortAnimTime);
						} else {
							// If the ViewPropertyAnimator APIs aren't
							// available, simply show or hide the in-layout UI
							// controls.
							controlsView.setVisibility(visible ? View.VISIBLE
									: View.GONE);
						}

						if (visible && AUTO_HIDE) {
							// Schedule a hide().
							delayedHide(AUTO_HIDE_DELAY_MILLIS);
						}
					}
				});

		// Set up the user interaction to manually show or hide the system UI.
		contentView.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				if (TOGGLE_ON_CLICK) {
					mSystemUiHider.toggle();
				} else {
					mSystemUiHider.show();
				}
			}
		});
		//---
		//contentView.setOnTouchListener(mDelayHideTouchListener);
		//---
		// Upon interacting with UI controls, delay any scheduled hide()
		// operations to prevent the jarring behavior of controls going away
		// while interacting with the UI.
		findViewById(R.id.dummy_button).setOnTouchListener(
				mDelayHideTouchListener);
		myInitalize();
		bindToService();
		
		
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);

		// Trigger the initial hide() shortly after the activity has been
		// created, to briefly hint to the user that UI controls
		// are available.
		delayedHide(100);		
	}

	/**
	 * Touch listener to use for in-layout UI controls to delay hiding the
	 * system UI. This is to prevent the jarring behavior of controls going away
	 * while interacting with activity UI.
	 */
	View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
		@Override
		public boolean onTouch(View view, MotionEvent motionEvent) {
			if (AUTO_HIDE) {
				delayedHide(AUTO_HIDE_DELAY_MILLIS);
			}
			return false;
		}
		
	};

	Handler mHideHandler = new Handler();
	Runnable mHideRunnable = new Runnable() {
		@Override
		public void run() {
			mSystemUiHider.hide();
			if(mIntroShow){
				final ImageView imIntro = (ImageView)findViewById(R.id.app_intro);
				imIntro.setVisibility(View.GONE);
			}
			mIntroShow = true;
		}
	};

	/**
	 * Schedules a call to hide() in [delay] milliseconds, canceling any
	 * previously scheduled calls.
	 */
	private void delayedHide(int delayMillis) {
		mHideHandler.removeCallbacks(mHideRunnable);
		mHideHandler.postDelayed(mHideRunnable, delayMillis);
	}

	@Override
	public void onInitializePlayerStart(String message) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onInitializePlayerSuccess() {
		// TODO Auto-generated method stub
		if(mAutoPlay){
			mService.getMediaPlayer().setState(MPStates.STARTED);
		}
		delayedHide(1000);
	}

	@Override
	public boolean onPlayerCompletedMedia() {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	public void onPlayerError() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Notification onCreateNotification() {
		// TODO Auto-generated method stub
		return null;
	}
	public void bindToService() {
        Intent intent = new Intent(this, MediaPlayerService.class);
 
        if (MediaPlayerServiceRunning()) {
            // Bind to LocalService
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
            Log.d("Player Service"," bin to service: already running");
        }
        else {
            startService(intent);
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
            Log.d("Player Service", "bin to service: now running");            
        }
    }
	private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder serviceBinder) {
            Log.d("Service Connection","Service connected");
 
            //bound with Service. get Service instance
            MediaPlayerBinder binder = (MediaPlayerBinder) serviceBinder;
            mService = binder.getService();            
            //send this instance to the service, so it can make callbacks on this instance as a client
            mService.setMPSListener(BbrActivity.this);
            mBound = true;
            mService.initializePlayer(mSelectedStream);
            mMediaPlayer = mService.getMediaPlayer();
            /**
             * 
            if(!mService.getMediaPlayer().isStarted()){            	
            	mService.initializePlayer(mSelectedStream);
            	Log.d("Media Player", "Initalized");
            	mMediaPlayer=mService.getMediaPlayer();
            	Log.d("Service Connection", "getMediaPlayer");
            }  
            */          
            //Set play/pause button to reflect state of the service's contained player
            //final ToggleButton playPauseButton = (ToggleButton) findViewById(R.id.playPauseBtn);
            //playPauseButton.setChecked(mService.getMediaPlayer().isPlaying());
            final ImageButton mPlayPauseButton = (ImageButton)findViewById(R.id.button_media_play);
            if(mMediaPlayer.isPlaying()){
            	mPlayPauseButton.setImageResource(R.drawable.media_pause_button);
            }
            else{
            	mPlayPauseButton.setImageResource(R.drawable.media_play_button);
            }
        }
 
        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };
	private boolean MediaPlayerServiceRunning() {
   	 
        ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
 
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if ("com.cadang.android.bbrproject.util.MediaPlayerService".equals(service.service.getClassName())) {
                return true;
            }
        } 
        return false;
    }
	/**
    * Closes unbinds from service, stops the service, and calls finish()
    */
    public void shutdownActivity() {
 
        if (mBound) {
            mService.stopMediaPlayer();
            // Detach existing connection.
            unbindService(mConnection);
            mBound = false;
         } 
        Intent intent = new Intent(this, MediaPlayerService.class);
        stopService(intent);
        finish();
 
    }
    private void myInitalize(){
    	InitPlayList("http://aoi.vn:8088/recommends/music/");
    	final ImageButton mPlayPause = (ImageButton)findViewById(R.id.button_media_play);
    	mPlayPause.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(mBound){
					mService.initializePlayer(mSelectedStream);
				}
			}
		});
    }
    private void InitPlayList(String listUrl){
    	MakePlayList mPlayList = new MakePlayList();
		mPlayList.setMakePlayListListener(new OnMakePlayListListener() {
			
			@Override
			public void onMakeListPreExecute() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onMakeListCompleted(MediaStream[] streamresult) {
				// TODO Auto-generated method stub
				if(streamresult != null){					
					mPlayStreams = streamresult;
					mStreamPosition = 0;
					mSelectedStream = mPlayStreams[mStreamPosition];
					if(mBound){
						if(mService.getMediaPlayer().isPlaying()){
							mService.stopMediaPlayer();        		
						}
						mService.initializePlayer(mSelectedStream);
					}
				}
			}
		});
		mPlayList.execute(listUrl);
    }

	/* (non-Javadoc)
	 * @see android.app.Activity#onBackPressed()
	 */	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
	    if (keyCode == KeyEvent.KEYCODE_BACK) {
	        moveTaskToBack(true);
	        return true;
	    }
	    return super.onKeyDown(keyCode, event);
	}
    
}
